package com.woniuxy.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.woniuxy.entity.AllUser;
import com.woniuxy.entity.DTO.UserGrowthDTO;
import com.woniuxy.entity.DTO.UserQueryDTO;
import com.woniuxy.mapper.UserMapper;
import com.woniuxy.service.IUserService;
import com.woniuxy.util.PageResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.util.Date;
import java.util.List;

/**
 * @Author pml
 * @Date 2025/7/15 19:00
 * @Description TODO
 * 用户服务实现类
 * 实现用户相关的业务逻辑
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, AllUser> implements IUserService {

    @Autowired
    private UserMapper userMapper;

    /**
     * 分页多条件查询用户列表
     * 使用MyBatis-Plus的分页插件和条件构造器实现复杂查询
     */
    @Override
    public PageResult<AllUser> getUserList(UserQueryDTO queryDTO) {
        // 创建分页对象，设置当前页码和每页数量
        Page<AllUser> page = new Page<>(queryDTO.getPageNum(), queryDTO.getPageSize());

        // 创建查询条件构造器
        QueryWrapper<AllUser> queryWrapper = new QueryWrapper<>();

        // 用户名模糊查询
        if (queryDTO.getUsername() != null && !queryDTO.getUsername().isEmpty()) {
            queryWrapper.like("username", queryDTO.getUsername());
        }

        // 用户昵称模糊查询
        if (queryDTO.getNickname() != null && !queryDTO.getNickname().isEmpty()) {
            queryWrapper.like("nickname", queryDTO.getNickname());
        }

        // 手机号模糊查询
        if (queryDTO.getPhone() != null && !queryDTO.getPhone().isEmpty()) {
            queryWrapper.like("phone", queryDTO.getPhone());
        }

        // 性别精确查询
        if (queryDTO.getSex() != null) {
            queryWrapper.eq("sex", queryDTO.getSex());
        }

        // 年级精确查询
        if (queryDTO.getGrade() != null) {
            queryWrapper.eq("grade", queryDTO.getGrade());
        }

        // 是否实名精确查询
        if (queryDTO.getIsAuth() != null) {
            queryWrapper.eq("is_auth", queryDTO.getIsAuth());
        }

        // 注册时间范围查询
        if (queryDTO.getCreateTimeStart() != null) {
            queryWrapper.ge("create_time", queryDTO.getCreateTimeStart());
        }
        if (queryDTO.getCreateTimeEnd() != null) {
            queryWrapper.le("create_time", queryDTO.getCreateTimeEnd());
        }

        // 排除已删除的用户
        queryWrapper.eq("is_deleted", 0);

        // 按创建时间降序排序
        queryWrapper.orderByDesc("create_time");

        // 执行分页查询
        IPage<AllUser> userPage = userMapper.selectPage(page, queryWrapper);

        // 封装分页结果
        PageResult<AllUser> pageResult = new PageResult<>();
        pageResult.setPageNum(queryDTO.getPageNum());
        pageResult.setPageSize(queryDTO.getPageSize());
        pageResult.setTotal(userPage.getTotal());
        pageResult.setPages((int) userPage.getPages());
        pageResult.setList(userPage.getRecords());

        return pageResult;
    }

    // 统计总用户数
    @Override
    public Long countTotalUsers() {
        QueryWrapper<AllUser> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("is_deleted", 0);
        return userMapper.selectCount(queryWrapper);
    }

    // 统计今日新增用户数
    @Override
    public Long countNewUsersToday() {
        QueryWrapper<AllUser> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("is_deleted", 0)
                .ge("create_time", LocalDate.now().atStartOfDay())
                .lt("create_time", LocalDate.now().plusDays(1).atStartOfDay());
        return userMapper.selectCount(queryWrapper);
    }

    /**
     * 获取用户增长趋势数据
     * 使用QueryWrapper构建复杂查询，替代XML文件实现
     * 保持与AllRunServiceImpl相同的代码风格
     */
    @Override
    public List<UserGrowthDTO> getUserGrowthTrend(Date startDate, Date endDate) {
        // 创建查询条件构造器
        QueryWrapper<AllUser> queryWrapper = new QueryWrapper<>();

        // 1. 过滤条件：只统计未删除用户
        queryWrapper.eq("is_deleted", 0);

        // 2. 日期范围过滤：创建时间在起始日期和结束日期之间
        // 注意：这里使用ge和le确保包含整个结束日期
        queryWrapper.ge("create_time", startDate)
                .le("create_time", endDate);

        // 3. 分组和排序：按日期分组，按日期升序排序
        // 使用apply方法添加SQL函数，将create_time转换为日期格式
        // 别名为date，与UserGrowthDTO的date字段对应
        queryWrapper.select("DATE(create_time) as date, COUNT(*) as userCount")
                .groupBy("DATE(create_time)")
                .orderByAsc("DATE(create_time)");

        // 4. 执行查询并返回结果
        // 使用selectMaps方法获取自定义字段的结果集
        // MyBatis-Plus会自动将Map结果映射到UserGrowthDTO
        return userMapper.selectMaps(queryWrapper)
                .stream()
                .map(map -> {
                    UserGrowthDTO dto = new UserGrowthDTO();
                    // 将数据库DATE类型转换为Java Date类型
                    dto.setDate(new Date(((java.sql.Date) map.get("date")).getTime()));
                    dto.setUserCount(((Number) map.get("userCount")).longValue());
                    return dto;
                })
                .collect(java.util.stream.Collectors.toList());
    }
}